home *** CD-ROM | disk | FTP | other *** search
/ Collection of Tools & Utilities / Collection of Tools and Utilities.iso / pascal / nonstop.zip / NONSTOP.ASM next >
Assembly Source File  |  1990-09-27  |  5KB  |  101 lines

  1. ;Copyright (C) 1990 by J. Scott Sanbar.  All rights reserved.
  2. ;
  3. ;NonStopISR - an external assembler routine written for Turbo Pascal
  4. ;Once installed with Keyboard Interrupt 09h pointing to it, it will
  5. ;check for CTRL-ALT-DEL, CTRL-BREAK and CTRL-C, throwing them away
  6. ;if the corresponding flag is set in the Turbo Pascal program.
  7. ;Needs sister .PAS module NONSTOP.PAS
  8.  
  9. DATA    SEGMENT WORD PUBLIC
  10.         ASSUME DS:DATA
  11. EXTRN   NoBoot    : BYTE
  12. EXTRN   NoBreak   : BYTE
  13. EXTRN   NoCtrlC   : BYTE
  14. EXTRN   OldIntr09 : DWORD
  15. DATA    ENDS
  16.  
  17. CODE    SEGMENT BYTE PUBLIC
  18.         ASSUME CS:CODE
  19.  
  20. NonStopISR PROC FAR
  21.            PUBLIC NonStopISR
  22.  
  23.         push    ds                     ;This is the initialization code
  24.         push    ax                     ;It will be used only once
  25.         mov     ax, seg DATA           ;To fix up the far jump
  26.         mov     ds, ax                 ;put Global Data Segment in DS
  27.         mov     cs:[JmpCode], 0eah     ;install far jump op code
  28.         push    [OldIntr09]            ;put pointer to old interrupt 09
  29.         pop     cs:Offs                ;in far jump offset
  30.         pop     cs:Segm                ;in far jump segment
  31.         xor     ax,ax                  ;point DS to interrupt vector table
  32.         mov     ds,ax                  ;ie, ds=0
  33.         push    ds:[24h]               ;Put offset of Int 09
  34.         pop     ax                     ;in ax
  35.         add     ax, Entry - NonStopISR ;Adjust past init code
  36.         push    ax
  37.         pop     ds:[24h]               ;revector to regular entry point
  38.         pop     ax
  39.         pop     ds
  40. Entry:
  41.         push    ds
  42.         push    es
  43.         push    ax
  44.         mov     ax, 40h                ;point es
  45.         mov     es, ax                 ;to BIOS data area
  46.         mov     ax, seg DATA           ;point ds
  47.         mov     ds, ax                 ;to data segment
  48.         mov     ah, es:[17h]           ;put keyboard shift flags in ax
  49.         and     ah, 00000100b          ;mask out everything but ctrl flag
  50.         or      ah, 00000000b          ;see if zero
  51.         jz      NormalKey              ;chain on if ctrl not pressed
  52.         in      al, 60h                ;get make/break code
  53.         xor     ah, ah                 ;zero ah
  54.         or      ah, NoBoot             ;Is flag set to disable soft boot?
  55.         jz      CheckBreak             ;No? Go check for break
  56.         mov     ah, es:[17h]           ;get keyboard shift flags
  57.         and     ah, 00001000b          ;mask out all but alt flag
  58.         or      ah, 00000000b          ;is result zero?
  59.         jz      CheckBreak             ;go on to check for break
  60.         cmp     al, 53h                ;is it del make?
  61.         jnz     CheckBreak             ;no, chain on to old int 09
  62.         jmp short TossIt               ;Soft boot attempted - no dice!
  63. CheckBreak:
  64.         xor     ah, ah                 ;zero ah
  65.         or      ah, NoBreak            ;Flag set to disable ctrl-break?
  66.         jz      CheckCtrlC             ;No? Go check for Ctrl-C
  67.         cmp     al, 0E0h               ;is it Break make?
  68.         jnz     CheckCtrlC             ;No? Go check for Ctrl-C
  69.         jmp short TossIt               ;Ctrl-Break attempted - toss it!
  70. CheckCtrlC:
  71.         xor     ah, ah                 ;zero ah
  72.         or      ah, NoCtrlC            ;flag set to disabe ctrl-c?
  73.         jz      NormalKey              ;No? Chain on to old ISR
  74.         cmp     al, 2Eh                ;C pressed?
  75.         jnz     NormalKey              ;No? Chain on to old ISR
  76. TossIt:
  77.         in      al, 61h                ;read keyboard control port
  78.         mov     ah, al
  79.         or      al, 10000000b          ;set the "reset" bit
  80.         out     61h, al                ;send it back to control
  81.         xchg    ah, al                 ;get back control value
  82.         out     61, al                 ;send it out also
  83.         cli
  84.         mov     al, 20h                ;send EOI to the
  85.         out     20h, al                ;interrupt controller
  86.         pop     ax;
  87.         pop     es;
  88.         pop     ds;
  89.         iret                           ;LATER, DUDE!
  90. NormalKey:
  91.         sti                            ;allow interrupts
  92.         pop     ax                     ;cleanup and
  93.         pop     es
  94.         pop     ds
  95. JmpCode db      ?                      ;Far jump to old Int 09
  96. Offs    dw      ?
  97. Segm    dw      ?
  98.  
  99. NonStopISR  ENDP
  100. CODE    ENDS
  101.         END     NonStopISR